#include <stdio.h>
#include <assert.h>

int IsZeor(double base)//判断浮点数是否和0相等
{
    if(base>=-0.0000001&&base<=0.0000001)
    {
        return 1;
    }
    return 0;
}

double unsignedPower(double base,int exponent)
{
    if(exponent==1)
    {
        return  base;
    }
    //例如：要计算一个数的14次方为x，先计算它的7(14/2)次方为a，再用a*a就为x(这里的14为偶数)
    //若是15次方x,则计算它7(15/2)次方a,在用a*a*base就为x(是否要乘base取决于x是偶数还是奇数)   

    double ret=unsignedPower(base,exponent>>1);//采用移位运算会提升效率
    ret=ret*ret;
    if((exponent&0x1)==1)
    {
        ret=ret*base;
    }
    return ret;
}

double Power(double base,int exponent)
{
    //处理底数为0并且指数为负数
    assert(!((base==0)&&(exponent<0)));

    //处理指数为0 或者底数为0
    if(IsZeor(base)||exponent==0)
    {
        return base;
    }

    int flag=0;//定义一个标志，来区分指数是正还是负数
    if(exponent<0)
    {
        exponent=-exponent;
        flag=1;
    }

    //计算其指数绝对值的次方
    double ret=unsignedPower(base,exponent);

    if(flag==1)
    {
        ret=1.0/ret;
    }
    return ret;
}

void TestPower()
{
    double base=12.3;
    int exp=8;
    double ret=Power(base,exp);
    printf("ret:%lf\n",ret);
}
int main()
{
    TestPower();
    return 0;
}
